#include "utils.h"

#define VALID_ITOR(T, I) Q_ASSERT(\
    (T.constBegin().i <= I.i) && (I.i <= T.constEnd().i)\
    )

void Utils::cross(const QVector<Line> & vec, QSet<Line> & result){
    result = result.intersect(vec.toList().toSet());
}

//void Utils::cross(const QVector<Range> & vec, QList<Range> & result){
//    auto itorVec = vec.begin();
//    auto itorResult = result.begin();
//    for(;itorResult!=result.end();){
//        for(;;){
//            if (itorVec == vec.end()){
//                result.erase(itorResult, result.end());
//                return;
//            }

//            if (itorVec->end <= itorResult->start){
//                ++itorVec;
//                if (itorVec != vec.end()){
//                    Q_ASSERT(itorVec->Valid());
//                }
//            }else{ break; }
//        }
//        auto itorResultDeleteBegin = itorResult;
//        for(;;){
//            if (itorResult == result.end()){ return; }
//            if (itorResult->end > itorVec->start){ break; }

//            ++itorResult;
//            if (itorResult != result.end()){
//                if (!itorResult->Valid()){
//                    auto aaa = QString("s:%1; e:%2").arg(itorResult->start).arg(itorResult->end);
//                    int aaa1 = 0;
//                }
//            }
//        }

//        if (itorVec->end < itorResult->start){ continue; }


//        itorResult = result.erase(itorResultDeleteBegin, itorResult);
//        if (itorVec->start > itorResult->start) { itorResult->start = itorVec->start; }
//        if (itorVec->end < itorResult->end) {
//            auto splitStart = itorVec->end;
//            auto splitEnd = itorResult->end;
//            itorResult->end = itorVec->end;
//            if (itorResult->Empty()){
//                itorResult->start = splitStart;
//                itorResult->end = splitEnd;
//            }else{
//                if (!itorResult->Valid()){
//                    auto aaa = QString("s:%1; e:%2").arg(itorResult->start).arg(itorResult->end);
//                    int aaa1 = 0;
//                }
//                itorResult = result.insert(itorResult+1, Range(splitStart, splitEnd));
//            }
//        }else{
//            ++itorResult;
//            if (itorResult != result.end()){
//                Q_ASSERT(itorResult->Valid());
//            }
//        }
//    }
//}

bool Utils::readLine(QFile & file, QString & line, qint64 & readBytes){
    line.clear(); readBytes = 0;
    const int BUFFER_SIZE = 1024;
    char buffer[BUFFER_SIZE];
    for(;;){
        auto currentReadByte = file.readLine(buffer, BUFFER_SIZE);
        if (currentReadByte == -1){ return false; }
        Q_ASSERT(currentReadByte);      // can not be 0 while read file system
        line.append(buffer);
        readBytes += currentReadByte;
        // no more data
        if (currentReadByte < BUFFER_SIZE - 1 || buffer[currentReadByte-1]=='\n'){ break; }
    }
    return true;
}
